﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.Interfaces.Repositorios;
using LM.Negocio.Objetos;

namespace LM.Negocio.Validadores
{
    public class ValidadorDeDependente : ValidadorAbastrato
    {
         private Dependente _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Dependente> _repositorioDeDependente;

        public ValidadorDeDependente( IRepositorioDeConsultaDeObjetos<Dependente> repositorioDeDependente)
        {
            if ( repositorioDeDependente == null )
            {
                throw new ArgumentNullException( "repositorioDeDependente" );
            }

            _repositorioDeDependente = repositorioDeDependente;
        }

        public void ValideCadastro( Dependente dependente )
        {
            if ( dependente == null )
            {
                throw new ArgumentException( "dependente" );
            }

            _objetoValidado = dependente;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideCpfNaoInformado();
            ValideCnhNaoInformado();
            ValideDependenteJaCadastrado();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao( Dependente dependente )
        {
            if ( dependente == null )
            {
                throw new ArgumentException( "dependente" );
            }

            _objetoValidado = dependente;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideCpfNaoInformado();
            ValideCnhNaoInformado();
            ValideDependenteNaoCadastrado();

            base.GarantaSucesso();
        }

        public void ValideExclusao( Dependente dependente )
        {
            if ( dependente == null )
            {
                throw new ArgumentException( "dependente" );
            }

            _objetoValidado = dependente;
            base.LimpeInconsistencias();

            ValideDependenteNaoCadastrado();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if ( _objetoValidado.Codigo == 0 )
            {
                AdicioneInconsistencia( "Código não informado." );
            }
        }

        private void ValideCpfNaoInformado()
        {
            if ( String.IsNullOrWhiteSpace(_objetoValidado.Cpf) )
            {
                AdicioneInconsistencia( "Cpf não informado." );
            }
        }

         private void ValideCnhNaoInformado()
        {
            if ( String.IsNullOrWhiteSpace(_objetoValidado.Cnh) )
            {
                AdicioneInconsistencia( "Cnh não informado." );
            }
        }

        private void ValideNomeNaoInformado()
        {
            if ( String.IsNullOrWhiteSpace( _objetoValidado.Nome ) )
            {
                AdicioneInconsistencia( "Descrição não informada." );
            }
        }

        private bool DependenteJaCadastrada()
        {
            return _repositorioDeDependente.Consulte( m => m.Codigo == _objetoValidado.Codigo ).Any();
        }

        private void ValideDependenteJaCadastrado()
        {
            if ( DependenteJaCadastrada() )
            {
                AdicioneInconsistencia( "Já existe um Dependente cadastrada com o código {0}.", _objetoValidado.Codigo );
            }
        }

        private void ValideDependenteNaoCadastrado()
        {
            if ( !DependenteJaCadastrada() )
            {
                AdicioneInconsistencia( "Dependente com o código {0} não cadastrada.", _objetoValidado.Codigo );
            }
        }
    }
}
